#ifndef FFMPEGKITS_H
#define FFMPEGKITS_H

#include <QObject>
#include <QWidget>
#include <QString>
#include <QThread>
#include <QMutex>
#include <QMutexLocker>
#include "VideoStructs.h"

extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
#include <libavutil/avutil.h>
#include <libavutil/imgutils.h>
#include <libavutil/time.h>
#include <libavutil/error.h>
}

class FFmpegKits : public QObject
{
    Q_OBJECT

public:
    explicit FFmpegKits(QObject *parent = nullptr);
    ~FFmpegKits();

    // 初始化解码器
    bool initDecoder(const VideoMetadata& metadata);

    // 解码视频帧
    void decodeVideoFrame(const VideoFrame& frame);

    // 清理资源
    void cleanup();

    // 判断解码器是否已初始化
    bool isInitialized() const { return m_initialized; }

signals:
    // 发送解码后的图像
    void sigGetOneFrame(const QImage &image);
    // 发送错误信息
    void sigPlayError(const QString &errorMsg);

public slots:
    void onMetadataReceived(const VideoMetadata& metadata);
    void onVideoFrameReceived(const VideoFrame& frame);

private:
    // 解码器相关成员
    AVCodecContext *m_pCodecCtx = nullptr;
    AVCodec *m_pCodec = nullptr;
    AVFrame *m_pFrameYUV = nullptr;
    AVFrame *m_pFrameRGB = nullptr;
    uint8_t *m_pOutBuffer = nullptr;
    SwsContext *m_pImgConvertCtx = nullptr;

    // 状态控制
    QMutex m_mutex;
    bool m_initialized = false;
    int m_width = 0;
    int m_height = 0;
};

#endif // FFMPEGKITS_H
